package study.activiti.j_receiveTask;

import java.io.InputStream;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;

/**  
 * @Name: ReceiveTaskTest
 * @Description: 接收任务测试类
 * @Author: 李超
 * @Create Date: 2016-12-15
 */
public class ReceiveTaskTest {
	
	//流程引擎
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine() ;
	
	/**  
	* @Name: delpoymentProcessDefinition_inputStream（方法的名称）
	* @Description: 部署流程定义文件（输入流加载资源文件）（方法的描述）
	* 输入流加载资源文件的三种方式
	* 		1、从classpath跟目录下加载指定名称的文件，不加斜杠
	* 		  InputStream in = this.getClass().getClassLoader().getResourceAsStream("test.bpmn") ;
	* 		2、从当前包下加载指定名称的文件
	* 		  InputStream in = this.getClass().getResourceAsStream("test.bpmn") ;
	* 		3、从classpath跟目录下加载指定名称的文件，加斜杠
	* 		  this.getClass().getResourceAsStream("/test.bpmn") ;
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-11 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void delpoymentProcessDefinition_inputStream() {
		//流程资源文件输入流
		InputStream inputStreamBpmn = this.getClass().getResourceAsStream("receiveTask.bpmn") ;
		InputStream inputStreamPng = this.getClass().getResourceAsStream("receiveTask.png") ;
		//部署流程定义
		Deployment deployment = processEngine.getRepositoryService()
					 .createDeployment()
					 .name("接收任务")
					 .addInputStream("receiveTask.bpmn", inputStreamBpmn)
					 .addInputStream("receiveTask.png", inputStreamPng)
					 .deploy() ;
		System.out.println("部署id:" + deployment.getId());
		System.out.println("部署名称:" + deployment.getName());
		System.out.println("部署时间:" + deployment.getDeploymentTime());
	}
	
	/**  
	* @Name: startProcessInstance（方法的名称）
	* @Description: 启动流程定义（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-14 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void startProcessInstance() {
		//流程定义key
		String processDefinitionKey = "receiveTask" ;
		//根据流程定义的key启动流程实例
		ProcessInstance processInstance = processEngine.getRuntimeService()
					 .startProcessInstanceByKey(processDefinitionKey) ;
		System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
		System.out.println("流程实例id:" + processInstance.getId());
	}
	
	/**  
	* @Name: completeReceiveTask（方法的名称）
	* @Description: 完成接收任务（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-14 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void completeReceiveTask() {
		//活动节点id：此处为接收任务【汇总当天销售额】的id属性值
		String activitiId1 = "receiveTask1" ;
		//1、根据活动节点id查询当前执行对象
		Execution execution1 = processEngine.getRuntimeService()
					 .createExecutionQuery()
					 .activityId(activitiId1)
					 .singleResult() ;
		//2、使用流程变量设置汇总当日销售额，用来传递业务参数
		processEngine.getRuntimeService()
					 .setVariable(execution1.getId(), "汇总当日销售额", 21000) ;
		//3、使流程实例向后执行一步，如果流程处于等待状态，使得流程继续执行，这里即执行当前接收任务，使其向下执行
		//	 使用signal给流程引擎信号，告诉他当前任务已经完成了，可以往后执行
		processEngine.getRuntimeService().signal(execution1.getId()) ;
		//4、查询当前执行对象
		//活动节点id：此处为接收任务【给总经理发短信】的id属性值
		String activitiId2 = "receiveTask2" ;
		Execution execution2 = processEngine.getRuntimeService()
					 .createExecutionQuery()
					 .activityId(activitiId2)
					 .singleResult() ;
		//5、从流程变量中获取“汇总当天销售额”的值
		Integer value = (Integer) processEngine.getRuntimeService().getVariable(execution2.getId(), "汇总当日销售额") ;
		//6、模拟给总经理发短线
		System.out.println("给总经理发短信：当日销售额为【" + value + "】元");
		//7、使流程实例向后执行一步，如果流程处于等待状态，使得流程继续执行，这里即执行当前接收任务，使其向下执行
		//	 使用signal给流程引擎信号，告诉他当前任务已经完成了，可以往后执行
		processEngine.getRuntimeService().signal(execution2.getId()) ;
		//8、查询流程状态，判断流程是否正常结束
		String processInstanceId = "142501" ;
		ProcessInstance processInstance = processEngine.getRuntimeService()
					 .createProcessInstanceQuery()
					 .processInstanceId(processInstanceId)
					 .singleResult() ;
		if(processInstance == null) {
			System.out.println("流程执行结束！！！");
		}
	}
	
	
	
	

}
